package com.ruoyi.common.core.service.impl;

import com.ruoyi.common.core.mapper.BaseMapper;
import com.ruoyi.common.core.service.BaseService;
import com.ruoyi.common.utils.PageUtils;
import java.util.List;
import java.util.Map;

/**
 * 基础 Service 实现类（纯 MyBatis 实现）
 * @param <T> 实体类类型
 * @param <M> Mapper 接口类型（需继承 BaseMapper）
 */
public abstract class BaseServiceImpl<T, M extends BaseMapper<T>> implements BaseService<T> {

    // 注入具体业务的 Mapper（通过构造方法注入，避免泛型注入问题）
    protected final M baseMapper;

    public BaseServiceImpl(M baseMapper) {
        this.baseMapper = baseMapper;
    }

    /**
     * 新增实体
     */
    @Override
    public int save(T entity) {
        // 可添加通用前置逻辑（如设置创建时间、创建人）
        return baseMapper.insert(entity);
    }

    /**
     * 批量新增
     */
    @Override
    public int saveBatch(List<T> entityList) {
        return baseMapper.insertBatch(entityList);
    }

    /**
     * 全字段更新
     */
    @Override
    public int updateById(T entity) {
        // 可添加通用前置逻辑（如设置更新时间、更新人）
        return baseMapper.updateById(entity);
    }

    /**
     * 选择性更新（非空字段）
     */
    @Override
    public int updateSelectiveById(T entity) {
        return baseMapper.updateSelectiveById(entity);
    }

    /**
     * 根据 ID 删除
     */
    @Override
    public int removeById(Long id) {
        return baseMapper.deleteById(id);
    }

    /**
     * 批量删除（ID 逗号分隔）
     */
    @Override
    public int removeByIds(String ids) {
        return baseMapper.deleteByIds(ids);
    }

    /**
     * 根据 ID 查询
     */
    @Override
    public T getById(Long id) {
        return baseMapper.selectById(id);
    }

    /**
     * 查询所有
     */
    @Override
    public List<T> listAll() {
        return baseMapper.selectAll();
    }

    /**
     * 实体条件查询
     */
    @Override
    public List<T> listByEntity(T entity) {
        return baseMapper.selectByEntity(entity);
    }

    /**
     * Map 条件查询
     */
    @Override
    public List<T> listByMap(Map<String, Object> params) {
        return baseMapper.selectByMap(params);
    }

    /**
     * 分页查询（依赖分页插件）
     */
    @Override
    public Map<String, Object> pageList(int pageNum, int pageSize, T entity) {
        // 计算分页起始位置
        int offset = (pageNum - 1) * pageSize;
        // 查询当前页数据
        List<T> list = baseMapper.selectPage(offset, pageSize, entity);
        // 查询总条数
        int total = baseMapper.selectCount(entity);
        // 封装分页结果（使用工具类）
        return PageUtils.getPageResult(total, pageSize, pageNum, list);
    }
}